package cn.tsingmo.otproxy.security;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;

/**
 * 认证处理器
 * 验证客户端连接的合法性
 */
public class AuthenticationHandler extends ChannelInboundHandlerAdapter {
    private static final Logger logger = LoggerFactory.getLogger(AuthenticationHandler.class);
    private boolean authenticated = false;
    private static final String EXPECTED_TOKEN = KeyManager.getAuthToken();

    /**
     * 处理接收到的数据
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (!authenticated) {
            // 第一次读取的数据必须是认证令牌
            if (!(msg instanceof byte[])) {
                logger.error("认证失败：无效的令牌格式");
                ctx.close();
                return;
            }

            String receivedToken = new String((byte[]) msg, StandardCharsets.UTF_8);

            // 验证令牌
            if (EXPECTED_TOKEN.equals(receivedToken)) {
                authenticated = true;
                logger.info("客户端认证成功");
                // 认证成功后，将数据传递给下一个处理器
                ctx.pipeline().remove(this); // 移除认证处理器
                ctx.fireChannelRead(msg);
            } else {
                logger.error("客户端认证失败：无效的令牌");
                ctx.close();
            }
        } else {
            // 认证成功后直接转发数据
            ctx.fireChannelRead(msg);
        }
    }

    /**
     * 连接超时处理
     */
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (!authenticated) {
            logger.error("客户端认证超时");
            ctx.close();
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }
}